package br.com.bankai.koby.repository.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

/**
 * 
 * @author Leonardo
 *
 */
@Entity
@Table(name = "tb_pessoa")
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa implements Serializable {

	private static final long serialVersionUID = -2174400807877771110L;

	public Pessoa() {
		setEnderecos(new ArrayList<Endereco>());
		setContatos(new ArrayList<Contato>());
	}

	public Pessoa(Long id, String tipo) {
		setId(id);
		setTipo(tipo);

		setEnderecos(new ArrayList<Endereco>());
		setContatos(new ArrayList<Contato>());
	}

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQ_PESSOA")
	@SequenceGenerator(name = "SQ_PESSOA", sequenceName = "SQ_PESSOA", allocationSize = 1)
	@Column(name = "id_pessoa", nullable = false)
	private Long id;

	@Column(name = "nm_pessoa", nullable = false)
	private String nome;

	@Column(name = "cd_status", nullable = false)
	private char status;

	@Column(name = "tp_pessoa", nullable = false)
	private String tipo;

	@Column(name = "dt_cadastro", nullable = false)
	private Date dataCadastro;

	@Column(name = "id_usuario_cadastro")
	private Long idUsuarioCadastro;

	@Column(name = "dt_alteracao")
	private Date dataAlteracao;

	@Column(name = "id_usuario_alteracao")
	private Long idUsuarioAlteracao;

	@LazyCollection(LazyCollectionOption.FALSE)
	@OneToMany(mappedBy = "pessoa", cascade = { CascadeType.ALL }, orphanRemoval = true)
	private List<Endereco> enderecos;

	@LazyCollection(LazyCollectionOption.FALSE)
	@OneToMany(mappedBy = "pessoa", cascade = { CascadeType.ALL }, orphanRemoval = true)
	private List<Contato> contatos;

	//Getters and Setters

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public char getStatus() {
		return status;
	}

	public void setStatus(char status) {
		this.status = status;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Long getIdUsuarioCadastro() {
		return idUsuarioCadastro;
	}

	public void setIdUsuarioCadastro(Long idUsuarioCadastro) {
		this.idUsuarioCadastro = idUsuarioCadastro;
	}

	public Date getDataAlteracao() {
		return dataAlteracao;
	}

	public void setDataAlteracao(Date dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}

	public Long getIdUsuarioAlteracao() {
		return idUsuarioAlteracao;
	}

	public void setIdUsuarioAlteracao(Long idUsuarioAlteracao) {
		this.idUsuarioAlteracao = idUsuarioAlteracao;
	}

	public Endereco getEndereco(char tipo) {
		for (Endereco endereco : getEnderecos()) {
			if (endereco.getTipo() == tipo) {
				return endereco;
			}
		}

		return null;
	}

	public void setEndereco(Endereco endereco) {
		if (getEnderecos().contains(endereco)) {
			getEnderecos().set(getEnderecos().indexOf(endereco), endereco);
		} else {
			getEnderecos().add(endereco);
		}
	}

	public List<Endereco> getEnderecos() {
		return enderecos;
	}

	public void setEnderecos(List<Endereco> enderecos) {
		this.enderecos = enderecos;
	}

	public List<Contato> getContatos() {
		return contatos;
	}

	public void setContatos(List<Contato> contatos) {
		this.contatos = contatos;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pessoa other = (Pessoa) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
}